package com.lagou.controller;

import com.lagou.domain.QueryVo;
import com.lagou.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/user") //一    级访问目录
@SessionAttributes("username") //想request域中(model)中存入key为username时,会同步到session域中
public class UserController {

    //path作用等同于value 设置方法的映射地址
    //method 用来限定请求方式
    //params 用来限定请求参数的条件 必须要携带参数进来
    @RequestMapping("/quick") //二级访问目录      /一级目录/二级目录
    public String quick(){

        //业务逻辑
        System.out.println("springmvc入门成功...");
        //视图跳转
        return "success";
    }


    //获取基本类型请求参数
    @RequestMapping("/simpleParam")
    public String simpleParam(Integer id,String username){

        System.out.println(id);
        System.out.println(username);
        return "success";
    }


    //获取对象类型请求参数
    @RequestMapping("/pojoParam")
    public String pojoParam(User user){

        System.out.println(user);
        return "success";
    }


    //获取数组类型请求参数
    @RequestMapping("/arrayParam")
    public String arrayParam(Integer[] id){

        System.out.println(Arrays.toString(id));
        return "success";
    }


    //获取集合(复杂)类型请求参数
    @RequestMapping("/queryParam")
    public String queryParam(QueryVo queryVo){
        System.out.println(queryVo);
        return "success";
    }

    //获取日期类型参数 自定义类型转换器
    @RequestMapping("/converterParam")
    public String converterParam(Date birthday){

        System.out.println(birthday);
        return "success";
    }

    //@RequestParam注解 name:匹配页面传递参数的名称  defaultValue:设置参数的默认值 required:设置是否必须传递该参数 默认值为true
    @RequestMapping("/findByPage")
    public String findByPage(@RequestParam(name = "pageNo",defaultValue = "1",required = false) Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize){
        System.out.println(pageNum); //2
        System.out.println(pageSize); //5
        return "success";
    }

    //@RequestHeader注解的使用
    @RequestMapping("/requestHeader")
    public String requestHeader(@RequestHeader("cookie") String cookie){
        System.out.println(cookie);
        return "success";
    }

    //@CookieValue注解的使用
    @RequestMapping("/cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID") String jsessionId){
        System.out.println(jsessionId);
        return "success";
    }

    //原始servlet的API的获取
    @RequestMapping("/servletAPI")
    public String servletAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        return "success";
    }

    //通过原始servletAPI进行页面跳转
    @RequestMapping("/returnVoid")
    public void returnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //直接返回数据
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("拉勾网");
        //借助request对象完成请求转发 一次请求
        //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        //借助response对象完成重定向 两次请求 WEB-INF是安全目录 不允许外部请求直接访问该目录资源 只可以进行服务器内部转发
        //response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

    //forward关键字进行请求转发
    @RequestMapping("/forward")
    public String forward(Model model){

        //还想在模型中设置一些值怎么做
        model.addAttribute("username","拉钩招聘");

        //使用请求转发 既可以转发到jsp 也可以转发到其他的控制器方法
        return "forward:/WEB-INF/pages/success.jsp";
    }

    //@SessionAttributes的效果:多个请求之间共享数据 也能取到username的值
    @RequestMapping("/returnString")
    public String returnString(){
        return "success";
    }

    //Redirect关键字进行重定向
    //当写了redirect或forward关键字 就不会走视图解析器
    @RequestMapping("/redirect")
    public String redirect(Model model){

        //底层使用的还是request.setAttribute 域范围是一次请求 而重定向是两次请求
        model.addAttribute("username","拉钩教育");
        return "redirect:/index.jsp";
    }

    //modelAndView进行页面跳转 方式一
    @RequestMapping("/returnModelAndView")
    public ModelAndView returnModelAndView(){

        //model:模型 作用就是封装存放数据
        //View:视图 作用用来展示数据
        ModelAndView modelAndView = new ModelAndView();

        //设置模型数据
        modelAndView.addObject("username","modelAndView方式一");

        //设置视图名称 视图解析器解析modelAndView拼接前缀和后缀
        modelAndView.setViewName("success");

        return modelAndView;
    }

    //modelAndView进行页面跳转 方式二 更为常用
    @RequestMapping("/returnModelAndView2")
    public ModelAndView returnModelAndView2(ModelAndView modelAndView){

        //model:模型 作用就是封装存放数据
        //View:视图 作用用来展示数据

        //设置模型数据
        modelAndView.addObject("username","modelAndView方式二");

        //设置视图名称 视图解析器解析modelAndView拼接前缀和后缀
        modelAndView.setViewName("success");

        return modelAndView;
    }

    //ajax异步交互
    @RequestMapping("/ajaxRequest")
    @ResponseBody
    public List<User> ajaxRequest(@RequestBody List<User> list){
        System.out.println(list);
        return list;
    }
}
